home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Browsers, Managers & Extensions / Firefox Backup Extension 6.0.3 / chrome / febe.jar / content / febeCommon.js < prev    next >
Text File  |  2008-09-07  |  35KB  |  955 lines

  1. // author: Chuck Baker
  2. // contact: febe@customsoftwareconsult.com
  3. // Version 6.0
  4.  
  5. //        Common (global) variables
  6. var Cc = Components.classes;
  7. var Ci = Components.interfaces;
  8.  
  9. // These should be constants, but CLEO opens this file and re-declares them
  10. var FEBE_GUID = "{4BBDD651-70CF-4821-84F8-2B918CF89CA3}"  // GUID of this extension
  11. var FEBEDATAFILE = "febeUserDefinedBuData.json";
  12.     
  13. // Get pointer to preferences
  14.     try{
  15.         var febePrefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch("");
  16.     }catch(e){
  17.         var msg = febeMsg[169];
  18.         febeFatal(e,msg);}
  19.  
  20. function febeGetUnicharPref(prefName) {
  21.     return febePrefs.getComplexValue(prefName, Ci.nsISupportsString).data;
  22. }
  23.  
  24. function febeSetUnicharPref(prefName, prefValue) {
  25.     var supportsString = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
  26.     supportsString.data = prefValue;
  27.     febePrefs.setComplexValue(prefName, Ci.nsISupportsString, supportsString);
  28.  
  29. // Set global variables
  30.     var febeBUtype = new String();            // "selective" or "profile"
  31.     var febeExBuDir = new String();            // Directory where the results are stored
  32.     var febeBUdate = new Date();            // Date of backup to restore
  33.     var febePathName = new String();        // Holds full path name of various files
  34.     var febeExtensionsList = {};            // Array holding extension names
  35.     var febeThemesList = {};                // Array holding theme names
  36.     var febeErrorList = [];                    // Array holding failed items (errors)
  37.     var febeWarningList = [];                // Array holding failed items (warnings)
  38.     var febeETinstall = [];                    // Array of ext/theme objects to install
  39.     var febeMsg = [];                        // Array holding localized strings
  40.     var febeTmpDir = new String();            // nsIFile pointer to temp directory
  41.     var febeDestDir = new String();            // nsIFile pointer used in febeDirCopy()
  42.     var febeSubRootDir = new String();        // Used in febeDirCopy()
  43.     var febeBuSeq = new String();            // FEBE Batch Sequence number
  44.     var FEBEdir = new String();                // Pointer to FEBE extension directory
  45.     var febeWin = new Object;                // Window object for FEBE windows
  46.     var febeProfDir = new String();            // Pointer to profile directory
  47.     var febeProfName = new String();        // Profile name
  48.     var febeVersion = new String();            // Version of this extension (FEBE)
  49.     var febePrName = new String();            // Leafname of file picker file
  50.     var febePfName = new String()            // Same as febePrName
  51.     var febePfParent = new String()            // Parent directory of filel picker file
  52.     var febeBuDesDir = new String();        // Pointer to backup destination directory
  53.     var febeExtExt = new String();            // ".xpi" (extension) or ".jar" (theme)
  54.     var febeInitialized;                    // Initalize function run yet?
  55.     var febeUseTimestampedDir = new Boolean(false);// Create timestamped subdirectories?
  56.     var febeMaxDirs = new Number;            // Maximum number of timestamped directories
  57.     var febeClearDestDir = new Boolean(false); // Clear destination directory?
  58.     var febeProfList = [];                    // Array of febeProfileObj objects
  59.     var febePlatform = new Number;            // 1=Windows, 2=*nix, 3=Mac 
  60.     //var febePathDelimiter = new String();    // Backslash for Windows, slash for Linux
  61.     var febeDisabledCount = new Number;        // Count of disabled extensions
  62.     var includeFEBE = new String();            // Include a copy of FEBE with backup?
  63.     var febeUDBuDone = [];                    // Array of completed User-defined backups
  64.     var febeClipboard = [];                    // Holds alert messages for the clipboard
  65.     var febeIgnoreError;                    // Error to ignore
  66.     var febeReminded;                        // If true,  dont show backup reminder
  67.     var febeWelcomePage = new String();        // URL of welcome page
  68.     var febex;                              // Misc flag
  69.     var febeWait;                            // Number of milliseconds until next scheduled backup
  70.     var febeDataFile;                        // Pointer to FEBEDATAFILE
  71.     var febeUploadAborted;                    // Monitors box.net upload
  72.     var febeAlertFinalHeight;                // Used in alert messages
  73.  
  74.   // Preferences
  75.     var buExtensions = new Boolean(false);        // Backup extensions?
  76.     var buThemes = new Boolean(false);            // Backup themes?
  77.     var buBookmarks = new Boolean(false);        // Backup bookmarks.html?
  78.     var buPreferences = new Boolean(false);        // Backup prefs.js?
  79.     var buCookies = new Boolean(false);            // Backup cookies.txt?
  80.     var buUserChrome = new Boolean(false);        // Backup userChrome.css?
  81.     var buUserPwd = new Boolean(false);            // Backup key3.db and signons.txt?
  82.     var buSearchPlugins = new Boolean(false);    // Backup searchplungins directory?
  83.     var buBrowserHistory = new Boolean(false);    // Backup history.dat?
  84.     var buFormFillHistory = new Boolean(false);    // Backup formhistory.dat?
  85.     var buPermissions = new Boolean(false);        // Backup hostperm.1?
  86.     var buUDBu = new Boolean(false);            // Backup User-defined backups?
  87.     var buProfile = new Boolean(false);            // Backup entire profile?
  88.     var ignoreDisabled = new Boolean(false);    // Ignore disabled extension?
  89.     var febeHideIcons = new Boolean(false);        // Hide statusbar icons?
  90.     var febeVerifyBackups = new Boolean(false);    // Verify backups?
  91.     var febeHideHelp = new Boolean(false);        // Hide help icons?
  92.     var febeDispProgress = new Boolean(false);    // Display progress window?
  93.     var febeDispResults = new Boolean(false);    // Display results page?
  94.     var febeSaveResults = new Boolean(false);    // Save results page?
  95.     var febePlaySounds = new Boolean(false);    // Play sounds?
  96.  
  97.   // Backup flags    
  98.     var exBackedUp = new Boolean(false);    // Did extensions backup ok?
  99.     var thBackedUp = new Boolean(false);    // Did themes backup ok?
  100.     var bmBackedUp = new Boolean(false);    // Did bookmarks backup ok?
  101.     var prBackedUp = new Boolean(false);    // Did the preferences backup ok?
  102.     var ckBackedUp = new Boolean(false);    // Did cookies backup ok?
  103.     var chBackedUp = new Boolean(false);    // Did user chrome backup ok?
  104.     var ucBackedUp = new Boolean(false);    // Did user content backup ok?
  105.     var pwBackedUp = new Boolean(false);    // Did passwords backup ok?
  106.     var spBackedUp = new Boolean(false);    // Did search plugins backup ok?
  107.     var hsBackedUp = new Boolean(false);    // Did history backup ok?
  108.     var ffBackedUp = new Boolean(false);    // Did form fill history backup ok?
  109.     var pmBackedUp = new Boolean(false);    // Did permissions file backup ok?
  110.     var udBackedUp = new Number;            // Number of User-defined bu's backed up
  111.     var upBackedUp = new Boolean(false);    // Did the user profile backup ok?
  112.     
  113.   // Backup file names
  114.     var bmBuName = new String();    // Bookmarks backup filename
  115.     var prBuName = new String();    // Preferences backup filename
  116.     var ckBuName = new String();    // Cookies backup filename
  117.     var chBuName = new String();    // UserChrome backup filename
  118.     var ucBuName = new String();    // UserContent backup filename
  119.     var pwBuName = new String();    // Password backup filename
  120.     var spBuName = new String();    // Search plugins backup filename
  121.     var hsBuName = new String();    // Browser history backup filename
  122.     var ffBuName = new String();    // Form fill history backup filename
  123.     var pmBuName = new String();    // Permissions backup filename
  124.     var udBuName = new String();    // User-defined backup filename
  125.     var upBuName = new String();    // User profile backup filename
  126.     
  127. function febeSetMsgs(){
  128.   // Error messages, prompts, etc.
  129.     var fs = document.getElementById('febe-strings');
  130.     if(!fs) {    // Can't find it?  Try looking for the FEBE options window
  131.         var wm = Cc["@mozilla.org/appshell/window-mediator;1"] .getService(Ci.nsIWindowMediator); 
  132.         var enumerator = wm.getEnumerator("febe:options"); 
  133.         while(enumerator.hasMoreElements()) { 
  134.             var win = enumerator.getNext(); 
  135.             fs = win.document.getElementById('febe-strings');
  136.         }//while 
  137.     }//if
  138.     var enumerator = fs.strings;
  139.     var cnt=0;
  140.     var id="";
  141.     while (enumerator.hasMoreElements()) {
  142.         if(cnt > 9){
  143.             id = cnt.toString();
  144.         }else{
  145.             id = "0" + cnt.toString();
  146.         }// if
  147.         var msg = "msg"+id;
  148.         try{
  149.             febeMsg.push(fs.getString(msg));
  150.         }catch(e){;}
  151.         enumerator.getNext();
  152.         cnt++;
  153.     }//while
  154.     return true;
  155. }//febeSetMsgs()
  156.  
  157. function febeGetPrefs(){
  158.   // Get/set the preferences
  159.     febeUseTimestampedDir = febePrefs.getBoolPref("extensions.febe.useTimestampedDir");
  160.     febeMaxDirs = febePrefs.getIntPref("extensions.febe.maxBuDirs");
  161.     febeClearDestDir = febePrefs.getBoolPref("extensions.febe.clearDestDir");
  162.     
  163.     febeBUtype = febePrefs.getCharPref("extensions.febe.buType");
  164.     if(febeBUtype == "selective"){
  165.         buProfile = false;
  166.     }else{
  167.         buProfile = true;
  168.     }//if
  169.     
  170.     buExtensions = febePrefs.getBoolPref("extensions.febe.buExtensions");
  171.     buThemes = febePrefs.getBoolPref("extensions.febe.buThemes");
  172.     buBookmarks = febePrefs.getBoolPref("extensions.febe.buBookmarks");
  173.     buPreferences = febePrefs.getBoolPref("extensions.febe.buPreferences");
  174.     buCookies = febePrefs.getBoolPref("extensions.febe.buCookies");
  175.     buUserChrome = febePrefs.getBoolPref("extensions.febe.buUserChrome");
  176.     buUserPwd = febePrefs.getBoolPref("extensions.febe.buUserPwd");
  177.     buSearchPlugins = febePrefs.getBoolPref("extensions.febe.buSearchPlugins");
  178.     buBrowserHistory = febePrefs.getBoolPref("extensions.febe.buBrowserHistory");
  179.     buFormFillHistory = febePrefs.getBoolPref("extensions.febe.buFormFillHistory");
  180.     buPermissions = febePrefs.getBoolPref("extensions.febe.buPermissions");
  181.     buUDBu = febePrefs.getBoolPref("extensions.febe.buUDBu");
  182.     ignoreDisabled = febePrefs.getBoolPref("extensions.febe.ignoreDisabled");
  183.     febeVerifyBackups = febePrefs.getBoolPref("extensions.febe.verifyBackups");
  184.     febePlaySounds = febePrefs.getBoolPref("extensions.febe.playSounds");
  185.     febeHideIcons = febePrefs.getBoolPref("extensions.febe.hideIcons");
  186.     febeHideHelp = febePrefs.getBoolPref("extensions.febe.hidehelp");
  187.     febeHideHelpIcons();
  188.     
  189.     febeDispProgress = febePrefs.getBoolPref("extensions.febe.displayprogresswin");
  190.     febeDispResults = febePrefs.getBoolPref("extensions.febe.displayresultspage");
  191.     febeSaveResults = febePrefs.getBoolPref("extensions.febe.saveresultspage");
  192.     includeFEBE = febePrefs.getBoolPref("extensions.febe.includefebe");
  193.     
  194.     // Create pointer to profile directory
  195.     febeProfDir = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("ProfD", Ci.nsIFile);
  196.     return true;
  197. }//febeGetPrefs()
  198.  
  199. function febeBuInProgress(){
  200.     return febePrefs.getBoolPref("extensions.febe.backupInProgress");
  201. }//febeBuInProgress()
  202.  
  203. function febeBuInProgressCheck(){
  204.     var style = "<style>color: red; font-weight: bold; font-size: 20px;</style>";
  205.     var tmp = style+febeMsg[229]+"\n\n"
  206.     style = "<style>color: black; font-size: 14px;</style>";
  207.     tmp += style+febeMsg[230]+"\n\n";
  208.     style = "<style>color: purple; font-size: 15px;</style>";
  209.     tmp += style+febeMsg[231];
  210.     if(!febeConfirm(tmp)){
  211.         febePrefs.setBoolPref("extensions.febe.backupInProgress",false);
  212.         return false;
  213.     }//if
  214.     return true;
  215. }//febeBuInProgressCheck()
  216.  
  217. function febeInitPref(prefName, dflt){
  218.   // Set a preference to default if needed
  219.     if(!febePrefs.prefHasUserValue(prefName)){        
  220.         febeSetUnicharPref(prefName,dflt);
  221.     }else if(febeGetUnicharPref(prefName) == ""){
  222.         febeSetUnicharPref(prefName,dflt);
  223.     }//if
  224.     return true;
  225. }//febeInitPref()
  226.  
  227. // Object declarations
  228. function febeExtObj(Name, Type, Version, Path, Icon, Home, Guid, Verified, Include, isDisabled, Minversion, Maxversion){
  229.     this.Name = new String(Name);
  230.     this.Type = new Number(Type);
  231.     this.Version = new String(Version);
  232.     this.Path = new String(Path); 
  233.     this.Icon = new String(Icon); 
  234.     this.Home = new String(Home); 
  235.     this.Guid = new String(Guid); 
  236.     this.Verified = new Boolean(Verified);
  237.     this.Include = new Boolean(Include);
  238.     this.isDisabled = new Boolean(isDisabled);
  239.     this.Minversion = new String(Minversion); 
  240.     this.Maxversion = new String(Maxversion); 
  241.     return true;
  242. }//febeExtObj
  243.  
  244. function febeProfileObj(Name, Path){
  245.     this.Name = Name;
  246.     this.Path = Path;    
  247.     return true;
  248. }//febeProfileObj object
  249.  
  250. function febeUDBuDoneObj(Description, Name){
  251.     this.Description = Description;
  252.     this.Name = Name;
  253.     return true;
  254. }//febeUDBuDoneObj()
  255.  
  256. function febeSetTimeoutObj(PID,Process,Started,Wait){
  257.     this.PID = PID;
  258.     this.Process = Process;
  259.     this.Started = Started;
  260.     this.Wait = Wait;
  261.     return true;
  262. }//febeSetTimeoutObj
  263.  
  264. function febeCookieObj(expires, host, isDomain, isSecure, name, path, policy, status, value){
  265.     this.expires = expires;
  266.     this.host = host;
  267.     this.isDomain = isDomain;
  268.     this.isSecure = isSecure;
  269.     this.name = name;
  270.     this.path = path;
  271.     this.policy = policy;
  272.     this.status = status;
  273.     this.value = value;
  274. }//febeCookieObj()
  275.  
  276. function febePrefObj(Name, Type, Value){
  277.     this.Name = Name;
  278.     this.Type = Type;
  279.     this.Value = Value;
  280. }//febePrefObj()
  281.  
  282. function febeGetPlatform(){
  283.     var platform = navigator.platform.toLowerCase();
  284.     if(platform.indexOf("win") != -1){febePlatform = 1;}
  285.     if(platform.indexOf("linux") != -1){febePlatform = 2;}
  286.     if(platform.indexOf("unix") != -1){febePlatform = 2;}
  287.     if(platform.indexOf("darwin") != -1){febePlatform = 3;}
  288.     if(platform.indexOf("macintel") != -1){febePlatform = 3;}
  289.     if(platform.indexOf("macppc") != -1){febePlatform = 3;}
  290.     
  291.     return febePlatform;
  292. }//febeGetPlatform()
  293.  
  294. function getFebeVersion() {
  295.     var em = Cc["@mozilla.org/extensions/manager;1"].getService(Ci.nsIExtensionManager);
  296.     var ext = null;
  297.     if (em.getItemForID){
  298.         ext = em.getItemForID(FEBE_GUID);
  299.     }else{
  300.         ext = em.getItemList(FEBE_GUID, null, {})[0];
  301.     }//if
  302.     return ext.version;
  303. }//getFebeVersion()
  304.  
  305. function setFebeVersion(){
  306.     febeSetMsgs();
  307.     if(document.getElementById("febeVersionID")){
  308.         var version = getFebeVersion();
  309.         document.getElementById("febeVersionID").value = febeMsg[49]+" "+version;
  310.     }//if
  311.     version = Cc['@mozilla.org/xre/app-info;1'].getService(Ci.nsIXULAppInfo).version;
  312.     if(document.getElementById("febeFxVersionID")){
  313.         document.getElementById("febeFxVersionID").value = version;
  314.     }//if
  315.     return true;
  316. }//setFebeVersion()
  317.  
  318. function febeValidateMaxDirs(){
  319.     var maxDirs = document.getElementById("maxBuDirsID").value;
  320.     if(isNaN(maxDirs)){
  321.         var w = this.window;
  322.         febeAlert(febeMsg[101]);
  323.         w.focus();
  324.         document.getElementById("maxBuDirsID").focus();
  325.         document.getElementById("maxBuDirsID").select();
  326.         return false;
  327.     }//if
  328.     document.getElementById("maxBuDirsID").value = parseInt(maxDirs);
  329.     return true;
  330. }//febeValidateMaxDirs()
  331.     
  332. function febeOpenLink(URL){
  333.     if(!URL){return;}
  334.     var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
  335.     var win = wm.getMostRecentWindow("navigator:browser");
  336.     var febeGetBrowser = win.getBrowser();
  337.     var currBlank = (febeGetBrowser &&
  338.     (febeGetBrowser.mCurrentTab.linkedBrowser &&
  339.     (febeGetBrowser.mCurrentTab.linkedBrowser.contentDocument.location == "about:blank")) ||
  340.     (!febeGetBrowser.mCurrentTab.linkedBrowser &&
  341.     (febeGetBrowser.mCurrentTab.label == "(Untitled)")));
  342.     if (currBlank)
  343.         {
  344.             var resultsWindow = win.loadURI(URL);
  345.         } else {
  346.             var resultsWindow = win.openNewTabWith(URL, this.docURL, null, null);
  347.     }//if
  348.     return true;
  349. }//febeOpenLink()
  350.  
  351. function febeHideHelpIcons(){
  352.     var prefName = "extensions.febe.hidehelp";
  353.     febeHideHelp = febePrefs.getBoolPref(prefName);
  354.     var c = "helpButton";
  355.     if(febeHideHelp){c = "none";}
  356.     for(var i=1; i<32; i++){
  357.         var seq = String(i);
  358.         if(i<10){seq = "0".concat(seq);}
  359.         var id = "febeHelp".concat(seq);
  360.         try{    
  361.             document.getElementById(id).setAttribute("class",c) ;
  362.         }catch(e){;}
  363.     }
  364.     return true;
  365. }//febeHideHelpIcons()    
  366.  
  367. function febeOptions(aPaneID){
  368.     febeWin = window.openDialog('chrome://febe/content/settings/febeOptions.xul', 'FEBE Options', 'chrome,titlebar,toolbar,centerscreen,resizable');    
  369.     febeWin.focus();
  370.     return true;
  371. }//febeOptions()
  372.  
  373. function febeHelp(helpIndex,fieldName){
  374.     febeWin = window.openDialog("chrome://febe/content/febeHelp.xul", "FEBE Help", "chrome,dialog=yes,alwaysRaised,resizable,titlebar=no,popup=yes",helpIndex,fieldName);
  375.     febeWin.focus();
  376.     return true;
  377. }//febeHelp()
  378.  
  379. function febeAlert(message){
  380.     // Modal windows don't seem to work on Mac (or *nix, possibly), so let's just take it out for everybody
  381.     febeWin = window.openDialog("chrome://febe/content/febeAlert.xul", "FEBE Alert","chrome,dialog=yes,alwaysRaised,resizable,titlebar=no,popup=yes" ,message);    
  382.     febeWin.focus();
  383.     return true;
  384. }//febeAlert()
  385.  
  386. function febeConfirm(message){
  387.     febeWin = window.openDialog("chrome://febe/content/febeConfirm.xul", "FEBE Confirm", "chrome,modal,dialog=yes,alwaysRaised,resizable,titlebar=no,popup=yes",message);    
  388.     febeWin.focus();
  389.     var prefName = "extensions.febe.confirm";
  390.     var OK = febePrefs.getBoolPref(prefName);
  391.     return OK;
  392. }//febeConfirm()
  393.  
  394. function febeError(message){
  395.     febeWin = window.openDialog("chrome://febe/content/febeError.xul", "FEBE Error", "chrome,dialog=yes,alwaysRaised,resizable,titlebar=no,popup=yes",message);
  396.     febeWin.focus();    
  397.     return true;
  398. }//febeAlert()
  399.  
  400. function febeConfirmOK(){
  401.     var prefName = "extensions.febe.confirm";
  402.     febePrefs.setBoolPref(prefName,true);
  403.     return true;
  404. }//febeConfirmOK()
  405.  
  406. function febeConfirmCancel(){
  407.     var prefName = "extensions.febe.confirm";
  408.     febePrefs.setBoolPref(prefName,false);
  409.     return true;
  410. }//febeConfirmOK()
  411.  
  412. function febeSetAlertMsg(){
  413.     febeSetConfirmMsg();
  414.     return true;
  415. }//febeSetAlertMsg()
  416.     
  417. function febeSetConfirmMsg(){
  418.     // If the message contains a style, it must be the first part of the message (one style per line, if needed)
  419.     var tmp = window.arguments[0]+"   \n\n";
  420.     var msg = {};
  421.     var i = 0;
  422.     while(true){    // Break it into an array
  423.         var item = new febeAlertObj();
  424.         var p = tmp.indexOf("\n");
  425.         if(p == -1){break;}
  426.         item.Style = "font-family: arial; font-size: 12pt; font-weight: normal; color: purple";  // Default style
  427.         var ps1 = tmp.indexOf("<style>");
  428.         if(ps1 == 0){    
  429.             var ps2 = tmp.indexOf("</style>");
  430.             if(ps2 != -1){
  431.                 item.Style = tmp.substr(7,ps2-7);            // "7" equals the length of "<style>"
  432.                 tmp = tmp.replace(tmp.substr(0,ps2+8),"");    // Remove the style
  433.                 p = tmp.indexOf("\n");
  434.             }//if
  435.         }//if
  436.         item.Text = tmp.substr(0,p);
  437.         msg[i] = item;
  438.         i++;
  439.         tmp = tmp.substr(p+1);    
  440.     }//while
  441.     febeClipboard = [];
  442.     var msgBox = document.getElementById("febeMsgBox");
  443.     if(msgBox){
  444.         for(var i in msg){
  445.             var desc = document.createElement("description");
  446.             desc.textContent = msg[i].Text;
  447.             desc.setAttribute("style",msg[i].Style);
  448.             msgBox.appendChild(desc);
  449.             febeClipboard.push(msg[i].Text);
  450.         }//for
  451.         document.documentElement.getButton("extra1").hidden = false;
  452.     }//if
  453.     febePlaySound("alert");
  454.     return true;
  455. }//febeSetConfirmMsg()
  456.  
  457. function febeSliderLoad(){
  458.     sizeToContent();
  459.     //febeGetPlatform();
  460.     febeAlertFinalHeight = window.outerHeight;
  461.     window.outerHeight = 1;
  462.     var x =(screen.availLeft + screen.availWidth - window.outerWidth) - 10;
  463.     var y = screen.availTop + screen.availHeight - window.outerHeight;
  464. //alert(x+"\n"+y)    
  465.     window.moveTo(x,y);
  466.     window.focus();
  467.     setTimeout(febeAnimateAlert, 25);
  468. }//febeSliderLoad()
  469.  
  470. function febeAnimateAlert(){
  471.      var febeAlertSliderIncrement = 10;    // Amount the slider grows by (pixels)
  472.     var febeAlertSliderTime = 25;        // Time between increments (milliseconds)
  473.     
  474.     if(window.outerHeight < febeAlertFinalHeight){
  475.         window.screenY -= febeAlertSliderIncrement;
  476.         window.outerHeight += febeAlertSliderIncrement;
  477.         setTimeout(febeAnimateAlert, febeAlertSliderTime);
  478.     }//if
  479. }//febeAnimateAlert()
  480.  
  481. function febeCopyToClipboard(){
  482.   // Copy the contents of a febeAlert, febeConfirm, or febeError box to the system clipboard
  483.     var gClipboardHelper = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
  484.     gClipboardHelper.copyString(febeClipboard.join("\n"));
  485.     return true;
  486. }//febeCopyToClipboard()
  487.  
  488. function febeAlertObj(Text,Style){
  489.     this.Text = Text;
  490.     this.Style = Style;
  491.     return true;
  492. }//febeAlertObj()
  493.  
  494. function febePlaySound(which){
  495.     febePlaySounds = febePrefs.getBoolPref("extensions.febe.playSounds");
  496.     if(febePlaySounds == false){return;}
  497.     var gSound = Cc["@mozilla.org/sound;1"].createInstance(Ci.nsISound);
  498.     var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  499.     var soundURL = "chrome://febe/content/sounds/"+which+".wav";
  500.     var url = ioService.newURI(soundURL, null, null);
  501.     gSound.init();
  502.     gSound.play(url);
  503.     return true;
  504. }//febePlaySound()
  505.  
  506. function febePlaySoundHelp(which){
  507.   // Alway play sounds in the "Play sounds" help window
  508.     var gSound = Cc["@mozilla.org/sound;1"].createInstance(Ci.nsISound);
  509.     var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  510.     var soundURL = "chrome://febe/content/sounds/"+which+".wav";
  511.     var url = ioService.newURI(soundURL, null, null);
  512.     gSound.init();
  513.     gSound.play(url);
  514.     return true;
  515. }//febePlaySoundHelp()
  516.  
  517. function febeParent(pathname){
  518.   // Return the parent of pathname.  Ex:
  519.   // If pathname is "C:\Documents and Settings\Owner\My Documents\some dir",
  520.   // the function will return "C:\Documents and Settings\Owner\My Documents"
  521.   
  522.     var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  523.     file.initWithPath(pathname);
  524.     return file.parent.path;
  525. }//febeParent()
  526.  
  527. function febeLeafname(pathname){
  528.   // Return the leafname of pathname.  Ex:
  529.   // If pathname is "C:\Documents and Settings\Owner\My Documents\some dir",
  530.   // the function will return "some dir"
  531.   
  532.     var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  533.     file.initWithPath(pathname);
  534.     return file.leafName;
  535. }//febeLeafname()
  536.  
  537. function febePause(millis){
  538.   // Pause for (millis) milliseconds
  539.     var date = new Date();
  540.     var curDate = null;
  541.     
  542.     do {curDate = new Date();}
  543.         while(curDate-date < millis);
  544.     return true;
  545. }//febePause() 
  546.  
  547. function febeWrap(str,len){    
  548.   // Return a string wrapped at len characters max per line
  549.     var tmpA = str.split(" ");
  550.     var returnVal="";
  551.     var tmp = "";
  552.     var skip = new Boolean(false);
  553.     for(var i = 0; i < tmpA.length; i++){
  554.         tmp += tmpA[i]+" ";
  555.         if(tmp.length >= len){
  556.             returnVal +="\n"+tmpA[i]+" ";
  557.             tmp = "";
  558.             i--;
  559.             skip = true;
  560.         }else{
  561.             if(skip == false){returnVal += tmpA[i]+" ";}
  562.             skip = false;
  563.         }//if
  564.     }//for
  565.     return returnVal;
  566. }//function febeWrap()
  567.  
  568. function febeFatal(err,msg){
  569.   // Display fatal errors
  570.     if(err.toString().indexOf(febeIgnoreError) != -1){return true;}
  571.     var style = "<style>color: black;font-size: 8pt;</style>";
  572.     var tmp = febeWrap(err.toString(),100);
  573.     tmp = tmp.replace(/\n/g,"\n"+style);
  574.     tmp = style + tmp;
  575.     tmp +="\n\n";
  576.     var ptSize = 12;
  577.     if(msg.length > 100){ptSize = 8;}
  578.     style = "<style>color: red;font-size: "+ptSize+"pt;</style>";
  579.     msg = msg.replace(/\n/g,"\n"+style);
  580.     tmp += style+msg;
  581.     febeError(tmp);
  582.     return true;
  583. }//febeFatal()
  584.  
  585. function febeLocalizedDate(aDate){
  586.     var lDate = new Date(aDate)
  587.     return lDate.toLocaleDateString()+" "+lDate.toLocaleTimeString();
  588. }//febeLocalizedDate()
  589.  
  590. function febeNewDirName(which,dirName){
  591.   // Rename timestamped directories from/to ISO8601 to European
  592.     var str = dirName.substr(10,5);
  593.     switch(which){
  594.         case 0:    // Rename DD.MM to MM-DD
  595.             str = str.substr(3,2)+"-"+str.substr(0,2);
  596.             break;
  597.         case 1:    // Rename MM-DD to DD.MM
  598.             str = str.substr(3,2)+"."+str.substr(0,2);
  599.             break;
  600.     }//switch
  601.     var newName = dirName.substr(0,10) + str + dirName.substr(15);
  602.     return newName;
  603. }//febeNewDirName(which,dirName)
  604.  
  605. function febeExtInfo(extGuid){
  606.   // Get extension info from extensions.rdf
  607.  
  608.     var rdfs = Cc["@mozilla.org/rdf/rdf-service;1"].getService(Ci.nsIRDFService);
  609.                      
  610.     var profileDir = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("ProfD", Ci.nsIFile);
  611.     profileDir.append("extensions.rdf");
  612.     
  613.     // Fix for international characters
  614.     var ioServ = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  615.     var fph = ioServ.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler);
  616.     var srcFile = fph.getURLSpecFromFile(profileDir);
  617.     
  618.     var ds = rdfs.GetDataSourceBlocking(srcFile);
  619.     
  620.     // Use old method if something comes up undefined
  621.     var em = Cc["@mozilla.org/extensions/manager;1"].getService(Ci.nsIExtensionManager);
  622.     var ext = null;
  623.     if (em.getItemForID){
  624.         ext = em.getItemForID(extGuid);
  625.     }else{
  626.         ext = em.getItemList(extGuid, null, {})[0];
  627.     }//if
  628.     
  629.     if(!ext){
  630.         var style = "<style>color: red;font-size: 12pt;</style>";
  631.         var tmp = style+febeMsg[219].replace("%GUID%",extGuid)+"\n"
  632.         febeAlert(tmp);
  633.         return false;
  634.     }//if
  635.     
  636.     var subject = rdfs.GetResource("urn:mozilla:item:"+extGuid);
  637.     var prefix = "http://www.mozilla.org/2004/em-rdf#";
  638.     
  639.   // Guid
  640.     this.guid = extGuid;
  641.     
  642.   // Name
  643.     var predicate = rdfs.GetResource(prefix + "name");
  644.     var name = ds.GetTarget(subject, predicate, true);
  645.     if(name){
  646.         this.name = name.QueryInterface(Ci.nsIRDFLiteral).Value;
  647.     }else{
  648.         this.name = ext.name;
  649.     }//if
  650.     if(!this.name){this.name="(none)";}
  651.     
  652.   // Version
  653.     var predicate = rdfs.GetResource(prefix + "version");
  654.     var version = ds.GetTarget(subject, predicate, true);
  655.     if(version){
  656.         this.version = version.QueryInterface(Ci.nsIRDFLiteral).Value;
  657.     }else{
  658.         this.version = ext.version;
  659.     }//if
  660.     if(!this.version){this.version="(none)";}
  661.  
  662.   // Description
  663.     var predicate = rdfs.GetResource(prefix + "description");
  664.     var description = ds.GetTarget(subject, predicate, true);
  665.     if(description){this.description = description.QueryInterface(Ci.nsIRDFLiteral).Value;}
  666.     if(!this.description){this.description="(none)";}
  667.  
  668.   // Home Page URL
  669.     var predicate = rdfs.GetResource(prefix + "homepageURL");
  670.     var homepageURL = ds.GetTarget(subject, predicate, true);
  671.     if(homepageURL){this.homepageURL = homepageURL.QueryInterface(Ci.nsIRDFLiteral).Value;}
  672.     if(!this.homepageURL){this.homepageURL="";}
  673.  
  674.   // Creator
  675.     var predicate = rdfs.GetResource(prefix + "creator");
  676.     var creator = ds.GetTarget(subject, predicate, true);
  677.     if(creator){this.creator = creator.QueryInterface(Ci.nsIRDFLiteral).Value;}
  678.     if(!this.creator){this.creator="(none)";}
  679.  
  680.   // Disabled?
  681.     var predicate = rdfs.GetResource(prefix + "userDisabled");
  682.     var userDisabled = ds.GetTarget(subject, predicate, true);
  683.     if(userDisabled){
  684.         this.isDisabled = userDisabled.QueryInterface(Ci.nsIRDFLiteral).Value;
  685.     }else{
  686.         this.isDisabled = false;
  687.     }//if
  688.  
  689.   // iconURL
  690.     var predicate = rdfs.GetResource(prefix + "iconURL");
  691.     var iconURL = ds.GetTarget(subject, predicate, true);
  692.     if(iconURL){
  693.         this.iconURL = iconURL.QueryInterface(Ci.nsIRDFLiteral).Value;
  694.     }else{
  695.         this.iconURL = ext.iconURL;
  696.     }//if
  697.     if(!this.iconURL){this.iconURL="chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png";}
  698.     
  699.   // minVersion
  700.     this.minVersion = ext.minAppVersion;
  701.     if(!this.minVersion){this.minVersion="(none)";}
  702.     
  703.   // maxVersion    
  704.     this.maxVersion = ext.maxAppVersion;
  705.     if(!this.maxVersion){this.maxVersion="(none)";}
  706.     
  707.   // installLocation
  708.     var predicate = rdfs.GetResource(prefix + "installLocation");
  709.     var installLocation = ds.GetTarget(subject, predicate, true);
  710.     if(installLocation){this.installLocation = installLocation.QueryInterface(Ci.nsIRDFLiteral).Value;}
  711.     if(!this.installLocation){this.installLocation="(none)";}
  712.     
  713.   // parseType
  714.     var predicate = rdfs.GetResource(prefix + "type");
  715.     var parseType = ds.GetTarget(subject, predicate, true);
  716.     if(parseType){
  717.         this.type = parseType.QueryInterface(Ci.nsIRDFInt).Value;
  718.     }else{
  719.         this.type = ext.type;
  720.     }//if
  721.  
  722.   // internalName
  723.     var predicate = rdfs.GetResource(prefix + "internalName");
  724.     var internalName = ds.GetTarget(subject, predicate, true);
  725.     if(internalName){this.internalName = internalName.QueryInterface(Ci.nsIRDFLiteral).Value;}
  726.     if(!this.internalName){this.internalName="(none)";}
  727.     
  728.   // updateURL
  729.     var predicate = rdfs.GetResource(prefix + "updateURL");
  730.     var updateURL = ds.GetTarget(subject, predicate, true);
  731.     if(updateURL){this.updateURL = updateURL.QueryInterface(Ci.nsIRDFLiteral).Value;}
  732.     if(!this.updateURL){this.updateURL="(none)";}
  733.     
  734.   // optionsURL
  735.     var predicate = rdfs.GetResource(prefix + "optionsURL");
  736.     var optionsURL = ds.GetTarget(subject, predicate, true);
  737.     if(optionsURL){this.optionsURL = optionsURL.QueryInterface(Ci.nsIRDFLiteral).Value;}
  738.     if(!this.optionsURL){this.optionsURL="(none)";}
  739.     
  740.   // aboutURL
  741.     var predicate = rdfs.GetResource(prefix + "aboutURL");
  742.     var aboutURL = ds.GetTarget(subject, predicate, true);
  743.     if(aboutURL){this.aboutURL = aboutURL.QueryInterface(Ci.nsIRDFLiteral).Value;}
  744.     if(!this.aboutURL){this.aboutURL="(none)";}
  745.     
  746.   // availableUpdateURL
  747.     var predicate = rdfs.GetResource(prefix + "availableUpdateURL");
  748.     var availableUpdateURL = ds.GetTarget(subject, predicate, true);
  749.     if(availableUpdateURL){this.availableUpdateURL = availableUpdateURL.QueryInterface(Ci.nsIRDFLiteral).Value;}
  750.     if(!this.availableUpdateURL){this.availableUpdateURL="(none)";}
  751.     
  752.   // availableUpdateHash
  753.     var predicate = rdfs.GetResource(prefix + "availableUpdateHash");
  754.     var availableUpdateHash = ds.GetTarget(subject, predicate, true);
  755.     if(availableUpdateHash){this.availableUpdateHash = availableUpdateHash.QueryInterface(Ci.nsIRDFLiteral).Value;}
  756.     if(!this.availableUpdateHash){this.availableUpdateHash="(none)";}
  757.     
  758.   // availableUpdateVersion
  759.     var predicate = rdfs.GetResource(prefix + "availableUpdateVersion");
  760.     var availableUpdateVersion = ds.GetTarget(subject, predicate, true);
  761.     if(availableUpdateVersion){this.availableUpdateVersion = availableUpdateVersion.QueryInterface(Ci.nsIRDFLiteral).Value;}
  762.     if(!this.availableUpdateVersion){this.availableUpdateVersion="(none)";}
  763.     
  764.   // contributors
  765.     var predicate = rdfs.GetResource(prefix + "contributor");
  766.     var targets = ds.GetTargets(subject, predicate, true);
  767.     var contributors = [];
  768.     if(targets){
  769.         while (targets.hasMoreElements()){
  770.             var contributor = targets.getNext();
  771.             if (contributor instanceof Ci.nsIRDFLiteral){
  772.                 contributors.push(contributor.Value);
  773.             }//if
  774.         }//while
  775.         this.contributors = contributors;
  776.     }//if
  777.     return true;
  778. }//febeExtInfo()
  779.  
  780. function febeStripSpaces(extName){
  781.   // Remove spaces and undesirable characters from extension name
  782.     var tmp = "";
  783.     var mask = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  784.     mask += ".+-_";
  785.     for (var i = 0; i <= extName.length; i++){
  786.         var c = extName.charAt(i);
  787.         if( mask.indexOf(c) != -1 ){tmp += c};
  788.     }//for
  789.     return tmp;
  790. }//febeStripSpaces()
  791.  
  792. function febeCopyFile(sourcefile,destdir,dName){
  793.     if(dName == "parent.lock"){return true;}    // File is locked
  794.   // get a component for the file to copy
  795.     var aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  796.     if (!aFile) return false;
  797.  
  798.   // get a component for the directory to copy to
  799.     var aDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  800.     if (!aDir) return false;
  801.  
  802.   // next, assign URLs to the file components
  803.     aFile.initWithPath(sourcefile);
  804.     aDir.initWithPath(destdir);
  805.   // delete the destination file if it exists
  806.     var oFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  807.     oFile.initWithPath(destdir);
  808.     oFile.append(dName);
  809.     try{
  810.         oFile.remove(false);
  811.     }catch(e){
  812.         //alert(e);
  813.     }
  814.         
  815.   // finally, copy the file, renaming it
  816.     try{
  817.         aFile.copyTo(aDir,dName);
  818.     }catch(e){
  819.         var msg = febeMsg[168].replace("%sourcefile%",sourcefile+"\n");
  820.         msg = msg.replace("%destdir%",destdir+"\n");
  821.         msg = msg.replace("%dName%",dName);
  822.         febeFatal(e,msg);
  823.         return false;
  824.     }
  825.     return true;
  826. }//febeCopyFile
  827.  
  828. function febeObfuscate(bool, str){
  829.   //Modified base64 obfuscation
  830.     switch(bool){
  831.         case true:
  832.             try{    //Bug 439711 - btoa does not work on unicode characters, so use encodeURIComponent() instead
  833.                 var test = btoa(str);
  834.             }catch(e){
  835.                 str = "0"+encodeURIComponent(str);
  836.                 return str.toString();
  837.             }//try
  838.             var r=Math.floor(Math.random()*4+2);
  839.             for(var i=0; i<r; i++){
  840.                 str = btoa(str);
  841.             }                
  842.             return i.toString()+str;
  843.             break;
  844.         case false:
  845.             var c = new Number(str.charAt(0));
  846.             str = str.substr(1);
  847.             if(c == 0) {return decodeURIComponent(str);}
  848.             for(var i=0; i<c; i++){
  849.                 str = atob(str);
  850.             }    
  851.             return str;
  852.             break;
  853.         default:
  854.             return null;
  855.             break;
  856.     }
  857. }//febeObfuscate()
  858.  
  859. function febeChmod(aDir){
  860. // Recursively set file permissions
  861. //  Directories: 0755
  862. //  Files: 0644
  863.     if(febePlatform == 1) return true;    // Don't bother with Windows
  864.     var aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  865.     if (!aFile) return false;
  866.  
  867.     aFile.initWithPath(aDir);
  868.     var entries = aFile.directoryEntries;
  869.     
  870.     while(entries.hasMoreElements()){
  871.         var entry = entries.getNext();
  872.         entry.QueryInterface(Ci.nsIFile);
  873.         var src = entry.path;
  874.         if(entry.isDirectory()){
  875.             entry.permissions = 0755;
  876.             febeChmod(src);
  877.         }else{
  878.             entry.permissions = 0644;
  879.         }//if
  880.     }//while
  881.     return true;
  882. }//febeChmod()
  883.  
  884. function febeEscape(str){
  885.   // Convert apostrophes to double quotes
  886.     return str.replace(/\'/g,'"');
  887. }//febeEscape()
  888.  
  889. function febeProps(e)
  890. {
  891. var obj = e;
  892.   if (e === null) {
  893.     alert("props called with null argument", "error");
  894.     return;
  895.   }
  896.   if (e === undefined) {
  897.     alert("props called with undefined argument", "error");
  898.     return;
  899.   }
  900.   var ns = ["Methods", "Fields", "Unreachables"];
  901.   var as = [[], [], []]; // array of (empty) arrays of arrays!
  902.   var p, j, i; // loop variables, several used multiple times
  903.   var protoLevels = 0;
  904.   for (p = e; p; p = p.__proto__)
  905.   {
  906.     for (i=0; i<ns.length; ++i)
  907.       as[i][protoLevels] = [];
  908.     ++protoLevels;
  909.   }
  910.   var tmp = "";
  911.   var c = 0
  912.   for(var a in e){
  913.   tmp += a;
  914.   try{
  915.   tmp += " = "+obj[a] + "\n";
  916.   }catch(x){tmp += "\n";}
  917.   c++;
  918.   if(tmp.length > 500){
  919.     alert(tmp);
  920.     tmp = "";
  921.     c = 0;
  922. }
  923.   continue;
  924.     // Shortcoming: doesn't check that VALUES are the same in object and prototype.
  925.     var protoLevel = -1;
  926.     try
  927.     {
  928.       for (p = e; p && (a in p); p = p.__proto__)
  929.         ++protoLevel;
  930.     }
  931.     catch(er) { protoLevel = 0; } // "in" operator throws when param to props() is a string
  932.     var type = 1;
  933.     try
  934.     {
  935.       if ((typeof e[a]) == "function")
  936.         type = 0;
  937.     }
  938.     catch (er) { type = 2; }
  939.     as[type][protoLevel].push(a);
  940.   }
  941.   alert(tmp);
  942.   
  943.   function times(s, n) { return n ? s + times(s, n-1) : ""; }
  944.   for (j=0; j<protoLevels; ++j)
  945.     for (i=0;i<ns.length;++i)
  946.       if (as[i][j].length) 
  947.         alert(
  948.           ns[i] + times(" of prototype", j), 
  949.           (onePerLine ? "\n\n" : "") + as[i][j].sort().join(onePerLine ? "\n" : ", ") + (onePerLine ? "\n\n" : ""), 
  950.           "propList"
  951.         );
  952. }//props()
  953. //alert("febeCommon.js loaded");
  954.